package com.hanxiaozhang;

import de.codecentric.boot.admin.server.config.AdminServerProperties;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;

@EnableAdminServer
@EnableDiscoveryClient
@SpringBootApplication
public class HanxiaozhangAdminApplication8018 {

    public static void main(String[] args) {
        SpringApplication.run(HanxiaozhangAdminApplication8018.class, args);
        System.out.println(" ==========================>      START UP SUCCESS      <==========================\n" +
                " _    _                 __  __  _                 _____ _                        \n" +
                "| |  | |  ___     ____  \\ \\/ / |_|  ___     ___  |__  /| |     ___     ____   ____   \n" +
                "| |__| |/ __  \\ /  __  \\ \\/ /  / \\/ __  \\ /  _  \\  / / | |__ / __  \\ /  __  \\/ __  \\ \n" +
                "|  __  | |  | | | /  \\ | / / \\ | | |  | | | / \\ | / /  | |__ \\|  | | | /  \\ | /  \\ | \n" +
                "| |  | | |__|  \\| |  | |/ / \\ \\| | |__|  \\| \\_/ |/ /___| |  | |__|  \\| |  | |_\\__/ |\n" +
                "|_|  |_|____ /\\_\\_|  |_|_/   \\_\\_|____ /\\_\\_____/______|_|  |_|___/\\_\\_|  |_|  __| | \n" +
                "                                                                              /____| ");
    }

    @Configuration
    public static class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
        private final String adminContextPath;

        public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
            this.adminContextPath = adminServerProperties.getContextPath();
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {

            SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
            successHandler.setTargetUrlParameter("redirectTo");
            successHandler.setDefaultTargetUrl(adminContextPath + "/");

            http.authorizeRequests()
                    .antMatchers(adminContextPath + "/assets/**").permitAll()
                    .antMatchers(adminContextPath + "/login").permitAll()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                    .logout().logoutUrl(adminContextPath + "/logout").and()
                    .httpBasic().and()
                    .csrf()
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                    .ignoringAntMatchers(
                            adminContextPath + "/instances",
                            adminContextPath + "/actuator/**"
                    );
        }
    }

}
